package com.rain.raindada.scoring;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.rain.raindada.model.dto.question.QuestionContentDTO;
import com.rain.raindada.model.entity.App;
import com.rain.raindada.model.entity.Question;
import com.rain.raindada.model.entity.ScoringResult;
import com.rain.raindada.model.entity.UserAnswer;

import com.rain.raindada.model.vo.QuestionVO;
import com.rain.raindada.service.QuestionService;
import com.rain.raindada.service.ScoringResultService;


import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 自定义测评类应用评分策略
 * @author RampageRain
 */
@ScoringStrategyConfig(appType = 1, scoringStrategy = 0)
//自动注入了Spring中
public class CustomTestScoringStrategy implements ScoringStrategy {

    @Resource
    private QuestionService questionService;

    @Resource
    private ScoringResultService scoringResultService;
    @Override
    public UserAnswer doScore(List<String> choices, App app) throws Exception {
        Long appId=app.getId();
        //1.根据id查询到题目和题目结果信息
        Question question = questionService.getOne(
                Wrappers.lambdaQuery(Question.class).eq(Question::getAppId, appId)
        );
        List<ScoringResult> scoringResultList = scoringResultService.list(
                Wrappers.lambdaQuery(ScoringResult.class).eq(ScoringResult::getAppId, appId)
        );
        //2.计算得分，统计用户每个选择对应的属性个数
        Map<String, Integer> optionCount = new HashMap<>();
        QuestionVO questionVO=QuestionVO.objToVo(question);
        List<QuestionContentDTO> questionContent = questionVO.getQuestionContent();
        //遍历题目列表
        for (QuestionContentDTO questionContentDTO : questionContent) {
            //遍历答案列表
            for(String answer:choices)
            {
                //遍历题目中的选项
                for (QuestionContentDTO.Option option : questionContentDTO.getOptions()) {
                    //如果答案和选项的key匹配
                    if(option.getKey().equals(answer))
                    {
                        //获取选项的result属性
                        String result = option.getResult();

                        //如果result属性不在optionCount中，初始化为0
                        if(!optionCount.containsKey(result))
                        {
                            optionCount.put(result, 0);
                        }
                        //在optionCount中增加计数
                        optionCount.put(result, optionCount.get(result)+1);
                    }
                }
            }
        }
        //3.遍历每种-评分结果，计算哪个结果得分更高
        int maxScore=0;
        ScoringResult maxScoreResult=scoringResultList.get(0);
        //遍历评分结果列表
        for(ScoringResult scoringResult:scoringResultList)
        {
            List<String> resultProp = JSONUtil.toList(scoringResult.getResultProp(), String.class);
            //计算当前评分结果的分数
            int score=resultProp.stream()
                    .mapToInt(prop->optionCount.getOrDefault(prop, 0))
                    .sum();
            //如果分数高于当前最高分数，更新最高分数和最高分数对应的评分结果
            if(score>maxScore)
            {
                maxScore=score;
                maxScoreResult=scoringResult;
            }
        }
        //4.构造返回值，计算哪个结果的得分更高
        UserAnswer userAnswer=new UserAnswer();
        userAnswer.setAppId(appId);
        userAnswer.setAppType(app.getAppType());
        userAnswer.setScoringStrategy(app.getScoringStrategy());
        userAnswer.setChoices(JSONUtil.toJsonStr(choices));
        userAnswer.setResultId(maxScoreResult.getId());
        userAnswer.setResultName(maxScoreResult.getResultName());
        userAnswer.setResultDesc(maxScoreResult.getResultDesc());
        userAnswer.setResultPicture(maxScoreResult.getResultPicture());
        return userAnswer;
    }
}
